package com.jeegod.core.base;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.io.Serializable;

/**
 * 前端返回对象
 * <p>前端与服务器的每一次通讯都需要经过Result来组装报文</p>
 *
 * @author 龚小龙
 * @version 1.0-20181215
 */
public class Result implements Serializable {

    /**
     * 序列版本ID，用于序列化绑定，反序列化时验证
     */
    private static final long serialVersionUID = 9016044849032671879L;

    /**
     * 成功与否标志，前端据此判断交易是否成功
     */
    private boolean success = true;

    /**
     * 返回状态码，为空则默认200.前端需要拦截一些常见的状态码如403、404、500等
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer status = 200;

    /**
     * 编码，可用于前端处理多语言，不需要则不用返回编码
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String code;

    /**
     * 相关消息，前端收到后可直接展示的提示信息
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String msg;

    /**
     * 相关数据，一些明细/集合信息，多用于JSON请求
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Object data;


    /**
     * 默认构造函数
     * <p>一般添加带参数的构造函数时都会将默认构造函数显示编码出来</p>
     */
    public Result() {
    }

    /**
     * 构造函数：可初始化成功与否标志
     *
     * @param success 成功与否标志
     */
    public Result(boolean success) {
        this.success = success;
    }

    /**
     * 构造函数：可初始化成功与否标志和状态码
     *
     * @param success 成功与否标志
     * @param status  状态代码
     */
    public Result(boolean success, Integer status) {
        this.success = success;
        this.status = status;
    }

    /**
     * 构造函数：可初始化成功与否标志、编码和相关信息
     *
     * @param success 成功与否标志
     * @param code    编码
     * @param msg     相关信息
     */
    public Result(boolean success, String code, String msg) {
        this.success = success;
        this.code = code;
        this.msg = msg;
    }

    /**
     * 构造函数：可初始化成功与否标志、状态码、编码和相关信息
     *
     * @param success 成功与否标志
     * @param status  状态码
     * @param code    编码
     * @param msg     相关信息
     */
    public Result(boolean success, Integer status, String code, String msg) {
        this.success = success;
        this.status = status;
        this.code = code;
        this.msg = msg;
    }


    /**
     * 构造函数：可初始化成功与否标志、编码、相关信息和相关数据
     *
     * @param success 成功与否标志
     * @param code    编码
     * @param msg     相关信息
     * @param data    相关数据
     */
    public Result(boolean success, String code, String msg, Object data) {
        this.success = success;
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 取得：成功与否标志
     *
     * @return 成功与否标志
     */
    public boolean isSuccess() {
        return success;
    }

    /**
     * 设置：成功与否标志
     *
     * @param success 成功与否标志
     */
    public void setSuccess(boolean success) {
        this.success = success;
    }

    /**
     * 取得：状态代码
     *
     * @return 状态代码
     */
    public Integer getStatus() {
        return status;
    }

    /**
     * 设置：状态代码
     *
     * @param status 状态代码
     */
    public void setStatus(Integer status) {
        this.status = status;
    }

    /**
     * 取得：编码
     *
     * @return 编码
     */
    public String getCode() {
        return code;
    }

    /**
     * 设置：编码
     *
     * @param code 编码
     */
    public void setCode(String code) {
        this.code = code;
    }

    /**
     * 取得：相关信息
     *
     * @return 相关信息
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 设置：相关信息
     *
     * @param msg 相关信息
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * 取得：相关数据
     *
     * @return 相关数据
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置：相关数据
     *
     * @param data 相关数据
     */
    public void setData(Object data) {
        this.data = data;
    }
}
